home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / creation_call.e < prev    next >
Text File  |  2000-03-25  |  6KB  |  201 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. deferred class CREATION_CALL
  17. --
  18. -- For creation all kinds of creation call : CREATION_CALL_1,
  19. -- CREATION_CALL_2, CREATION_CALL_3 and CREATION_CALL_4.
  20. --
  21. -- Sorry for the following class names, but I have no more ideas at this
  22. -- time :-(. Classification used is :
  23. --      CREATION_CALL_1    -->    !!foo
  24. --      CREATION_CALL_2    -->    !BAR!foo
  25. --      CREATION_CALL_3    -->    !!foo.bar(...)
  26. --      CREATION_CALL_4    -->    !BAR!foo.bar(...)
  27. --
  28.  
  29. inherit INSTRUCTION;
  30.  
  31. feature
  32.  
  33.    end_mark_comment: BOOLEAN is false;
  34.  
  35.    start_position: POSITION;
  36.          -- Of the first character '!'.
  37.  
  38.    type: TYPE is
  39.          -- Explicit optional generator name if any.
  40.       deferred
  41.       end;
  42.  
  43.    writable: EXPRESSION;
  44.          -- The target of the creation call.
  45.  
  46.    call: PROC_CALL is
  47.          -- Optional initialisation call if any.
  48.          -- Target of `call' is `writable'.
  49.       deferred
  50.       end;
  51.  
  52.    run_feature: RUN_FEATURE;
  53.          -- When checked, if any, the only one corresponding
  54.          -- creation procedure.
  55.  
  56.    arg_count: INTEGER is
  57.       do
  58.          if call /= Void then
  59.             Result := call.arg_count;
  60.          end;
  61.       end;
  62.  
  63.    frozen stupid_switch(r: ARRAY[RUN_CLASS]): BOOLEAN is
  64.       local
  65.          t: TYPE;
  66.       do
  67.          if type /= Void then
  68.             t := type;
  69.          else
  70.             t := writable.result_type;
  71.          end;
  72.          if t.is_anchored then
  73.          elseif t.is_generic then
  74.          else
  75.             if call = Void then
  76.                Result := writable.stupid_switch(r);
  77.             else
  78.                Result := call.stupid_switch(r);
  79.             end;
  80.          end;
  81.       end;
  82.  
  83. feature {CREATION_CALL}
  84.  
  85.    current_type: TYPE;
  86.  
  87. feature {NONE}
  88.  
  89.    check_writable(ct: TYPE) is
  90.       require
  91.          current_type = Void;
  92.          ct /= Void
  93.       local
  94.          w: like writable;
  95.       do
  96.          current_type := ct;
  97.          w := writable.to_runnable(ct);
  98.          if w = Void then
  99.             eh.add_position(writable.start_position);
  100.             fatal_error("Bad writable target for creation.");
  101.          else
  102.             writable := w;
  103.          end;
  104.       ensure
  105.          current_type = ct
  106.       end;
  107.  
  108.    check_created_type(t: TYPE) is
  109.       require
  110.          t.is_run_type
  111.       local
  112.          rt: like t;
  113.       do
  114.          rt := t.run_type;
  115.          if small_eiffel.short_flag then
  116.          elseif rt.base_class.is_deferred then
  117.             eh.add_type(rt," is deferred. ");
  118.             warning(start_position,"Cannot create object.");
  119.          end;
  120.          if t.is_formal_generic then
  121.             eh.add_position(start_position);
  122.             eh.append("Creation call on formal generic type (");
  123.             eh.add_type(t,").");
  124.             eh.print_as_fatal_error;
  125.          end;
  126.          rt.run_class.set_at_run_time;
  127.       end;
  128.  
  129.    frozen c2c_opening(t: TYPE) is
  130.       require
  131.          t.is_reference
  132.       local
  133.          rc: RUN_CLASS;
  134.          once_result: ONCE_RESULT;
  135.       do
  136.          rc := t.run_class;
  137.          cpp.se_trace_ins(start_position);
  138.          cpp.put_character('{');
  139.          gc_handler.allocation(rc);
  140.          cpp.expanded_attributes(t);
  141.          once_result ?= writable;
  142.          if once_result /= Void then
  143.             cpp.put_string(once_result.c_variable_name);
  144.             cpp.put_string("=((T0*)n);%N");
  145.          end;
  146.       end;
  147.  
  148.    frozen c2c_closing(t: TYPE) is
  149.       require
  150.          t.is_reference
  151.       local
  152.          once_result: ONCE_RESULT;
  153.       do
  154.          once_result ?= writable;
  155.          if once_result = Void then
  156.             writable.compile_to_c;
  157.             cpp.put_string("=((T0*)n);%N");
  158.          end;
  159.          if cpp.call_invariant_start(t) then
  160.             cpp.put_character('n');
  161.             cpp.call_invariant_end;
  162.             cpp.put_character(';');
  163.          end;
  164.          cpp.put_character('}');
  165.          cpp.put_character('%N');
  166.       end;
  167.  
  168.    frozen c2c_clear_expanded(id: INTEGER) is
  169.          -- Produce C code to reset the writable expanded
  170.          -- to the default value.
  171.       do
  172.          writable.compile_to_c;
  173.          cpp.put_character('=');
  174.          cpp.put_character('M');
  175.          cpp.put_integer(id);
  176.          cpp.put_string(fz_00);
  177.       end;
  178.  
  179.    compile_to_jvm0(t: TYPE) is
  180.          -- Push the new object with default initialization.
  181.       require
  182.          t /= Void
  183.       local
  184.          dummy: INTEGER;
  185.       do
  186.          if t.is_reference then
  187.             t.run_class.jvm_basic_new;
  188.          else
  189.             dummy := t.jvm_push_default;
  190.          end;
  191.       end;
  192.  
  193. invariant
  194.  
  195.    not start_position.is_unknown;
  196.  
  197.    writable.is_writable;
  198.  
  199. end -- CREATION_CALL
  200.  
  201.